# -*- mode: python ; coding: utf-8 -*-

from PyInstaller.utils.hooks import collect_data_files

block_cipher = None

a = Analysis(
    ['run.py'],
    pathex=[],
    binaries=[],
    # 核心修改点 1: 添加数据文件
    datas=[
        # 包含整个Django框架本身需要的模板和数据
        *collect_data_files('django'),
        # 强制包含整个 djangorestframework 包的所有文件
        *collect_data_files('rest_framework'),
        # 包含您的项目模板文件夹 (假设它在根目录叫 'templates')
        
        # 包含您收集好的静态文件
        ('staticfiles', 'staticfiles'),
        
        # 包含您的应用自己的模板、静态文件等 (替换 'config_app' 为您自己的应用名)
        ('config_app', 'config_app'),
        ('config_app/templates', 'config_app/templates'), 
        
        # 包含您的数据库文件
        ('db.sqlite3', '.')
    ],
    # 核心修改点 2: 添加隐藏的导入
    # Django 动态加载很多东西，PyInstaller 可能找不到
    hiddenimports=[
        'config_app.urls',
        'config_app.views',
        'config_app.models',
        'config_app.forms',
        'config_app.admin',
        'config_app.apps',
        'config_app.migrations',
        'config_app.tools',
        'config_app.agent',
        'rest_framework',                   # 1. DRF 根模块，必须有
        'rest_framework.authentication',    # 2. 认证模块，您的错误明确指出需要
        'rest_framework.permissions',       # 3. 权限模块，通常与认证一起使用
        'rest_framework.parsers',           # 4. 解析器模块，用于处理请求体 (JSON, 表单等)
        'rest_framework.renderers',         # 5. 渲染器模块，用于格式化响应 (JSON, Browsable API等)
        'rest_framework.serializers',       # 6. 序列化器模块，DRF的核心，几乎必用
        'rest_framework.routers',           # 7. 路由器模块，如果您使用了ViewSet
        'rest_framework.views',             # 8. 视图模块，APIView的基础
        'rest_framework.viewsets',          # 9. 视图集模块，如果您使用了ViewSet
        'rest_framework.fields',            # 10. 序列化器字段模块
        'rest_framework.negotiation',       # 11. 内容协商模块，用于选择请求/响应的格式
        'rest_framework.metadata',          # 12. 元数据模块，用于生成API文档
        
        'rest_framework.response',          # 定义了 DRF 的 Response 对象
        'rest_framework.status',            # 包含了所有 HTTP 状态码，如 status.HTTP_200_OK
        'rest_framework.exceptions',        # 定义了 APIException 等核心异常
        'rest_framework.pagination',        # 如果您使用了任何形式的分页功能
        'rest_framework.templatetags',      # 可浏览API页面可能会用到
        'rest_framework.filters',           # 包含了搜索、排序等过滤器基类
        
        'config_app.middleware',
        'config_app.templatetags',
        'config_app.utils',
        'config_app.signals',
        'config_app.tasks',
        'config_app.management.commands',
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='db_agent', # 修改为您想要的EXE文件名
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True, # 保持为True，这样可以看到后台日志和错误
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='db_agent', # 修改为最终输出的文件夹名
)